package AlgoritmosGeneticos.model.impl.cruces;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import utils.CustomRandom;
import AlgoritmosGeneticos.model.Individuo;
import AlgoritmosGeneticos.model.OperadorCruce;
import AlgoritmosGeneticos.model.impl.IndividuoImpl;

public class CruceMultiple implements OperadorCruce{

	private int cantidad = 5;
	
	public CruceMultiple(){
		super();
		System.out.println("Cruce Multiple");
	}
	@Override
	public List<Individuo> cruzar(Individuo i1, Individuo i2) {
		List<Integer> rands = new ArrayList<Integer>();
		LinkedList<Individuo> resp = new LinkedList<Individuo>();
		int random;
		/*Genero randoms*/
		for(int i=0; i<cantidad; i++){
			do{
				random = CustomRandom.getInstance().getRandomInt(i1.length());
//				System.out.println("random " + random);
//				if(random == 0){
//					System.out.println("PEPE!!");
//				}
			}while(random == 0 || random == i1.length() || rands.contains(random));
			rands.add(random);
			Collections.sort(rands);
		}
		rands.add(i1.length());
		
//		System.out.println("randoms: " + rands);
		
		String hijo1 = i1.getNumenoBinario().substring(0,rands.get(0));
//		System.out.println("hijo1.1: " + hijo1);
		String hijo2 = i2.getNumenoBinario().substring(0,rands.get(0));
//		System.out.println("hijo2.1: " + hijo2);
		
		for(int i=1; i<cantidad+1; i++){
			if(i % 2 == 0){
				hijo1 += i1.getNumenoBinario().substring(rands.get(i-1),rands.get(i));
//				System.out.println("hijo1.2: " + hijo1);
				hijo2 += i2.getNumenoBinario().substring(rands.get(i-1),rands.get(i));
//				System.out.println("hijo2.2: " + hijo2);
			}
			else{
				hijo1 += i2.getNumenoBinario().substring(rands.get(i-1),rands.get(i));
//				System.out.println("hijo1.3: " + hijo1);
				hijo2 += i1.getNumenoBinario().substring(rands.get(i-1),rands.get(i));
//				System.out.println("hijo2.3: " + hijo2);
			}
		}

//		hijo1 += i2.getNumenoBinario().substring(rands.get(cantidad -1), i2.length());
//		System.out.println("hijo1.4: " + hijo1);
//		hijo2 += i1.getNumenoBinario().substring(rands.get(cantidad -1), i1.length());
//		System.out.println("hijo2.4: " + hijo2);
		
		resp.add( new IndividuoImpl(hijo1,i1.getpMut()) );
		resp.add( new IndividuoImpl(hijo2,i2.getpMut()) );
		
		return resp;
	}
}
